www.gusucode.com > VC++ 立体声文件播放并录音-源码程序 > VC++ 立体声文件播放并录音-源码程序/code/hwPlayWavByMCIDlg.cpp

    // hwPlayWavByMCIDlg.cpp : implementation file
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "hwPlayWavByMCI.h"
#include "hwPlayWavByMCIDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// 为 DirectSound 函数添加头文件
#include <dsound.h>
// 为 DirectSound 函数添加库文件
#pragma comment ( lib, "dsound.lib" )
#pragma comment ( lib, "dxguid.lib" )

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHwPlayWavByMCIDlg dialog

CHwPlayWavByMCIDlg::CHwPlayWavByMCIDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CHwPlayWavByMCIDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CHwPlayWavByMCIDlg)
	m_nChannel = 1;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CHwPlayWavByMCIDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CHwPlayWavByMCIDlg)
	DDX_Radio(pDX, IDC_RADIO_Mono, m_nChannel);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CHwPlayWavByMCIDlg, CDialog)
	//{{AFX_MSG_MAP(CHwPlayWavByMCIDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_PLAY, OnButtonPlay)
	ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
	ON_BN_CLICKED(IDC_BUTTON_REC, OnButtonRec)
	ON_BN_CLICKED(IDC_BUTTON_SAVE, OnButtonSave)
	ON_BN_CLICKED(IDC_BUTTON_COMPACT, OnButtonCompact)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHwPlayWavByMCIDlg message handlers

BOOL CHwPlayWavByMCIDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here	
	EnumAudioDevice ();

	CComboBox *pCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);
	if ( pCombo->GetCount() > 0 )
		pCombo->SetCurSel ( 0 );
	GetDlgItem(IDC_BUTTON_SAVE)->EnableWindow ( FALSE );
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow ( FALSE );

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CHwPlayWavByMCIDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CHwPlayWavByMCIDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CHwPlayWavByMCIDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CHwPlayWavByMCIDlg::OnButtonPlay() 
{
	if ( !m_HwMCI.DeviceIDValid () )
	{
		if ( !m_HwMCI.Open ( "机遇.mp3" ) )
			return;
	}

	ASSERT ( m_HwMCI.DeviceIDValid () );
	m_HwMCI.Play ();
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow ( TRUE );
}

CHwPlayWavByMCIDlg::~CHwPlayWavByMCIDlg()
{

}

void CHwPlayWavByMCIDlg::OnButtonStop() 
{
	m_HwMCI.Stop ();
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow ( FALSE );
}

void CHwPlayWavByMCIDlg::OnButtonRec() 
{
	UpdateData ( TRUE );
	GetDlgItem(IDC_BUTTON_SAVE)->EnableWindow ( TRUE );
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow ( TRUE );
	m_HwMCI.Rec ( m_nChannel + 1 );
}

void CHwPlayWavByMCIDlg::OnButtonSave() 
{
	if ( m_HwMCI.Save ( "test.wav" ) )
	{
		MessageBox ( "Save wave file to [test.wav] success" );
	}
	GetDlgItem(IDC_BUTTON_SAVE)->EnableWindow ( FALSE );
}

BOOL CALLBACK DSEnumProc ( LPGUID lpGUID, 
						 LPCTSTR lpszDesc,
						 LPCTSTR lpszDrvName, 
						 LPVOID lpContext )
{
	CComboBox *pCombo = (CComboBox*)lpContext;
	ASSERT ( pCombo );
	LPGUID lpTemp = NULL;
	
	if (lpGUID != NULL) // NULL only for "Primary Sound Driver".
	{
		if ((lpTemp = (LPGUID)malloc(sizeof(GUID))) == NULL)
		{
			return(TRUE);
		}
		memcpy(lpTemp, lpGUID, sizeof(GUID));
	}
	//下面的代码主要主要是将设备添加到CComboBox,其实你完全直接将CComboBox指针传递过来,直接的添加,这里采用的是给combox窗口发送消息的方法,
	pCombo->AddString ( lpszDesc );
	pCombo->SetItemData ( 
		pCombo->FindString ( 0, lpszDesc),
		(DWORD)lpTemp );
	free(lpTemp);
	return(TRUE);
}

void CHwPlayWavByMCIDlg::EnumAudioDevice()
{
	CComboBox *pCombo = (CComboBox*)GetDlgItem (IDC_COMBO1);
	if (FAILED(DirectSoundCaptureEnumerate ((LPDSENUMCALLBACK)DSEnumProc,
		(VOID*)pCombo)) )
	{
		EndDialog(TRUE);
	}
}

void CHwPlayWavByMCIDlg::OnButtonCompact() 
{
	::ShellExecute ( NULL,_T("open"), "chrys@163.com", NULL,NULL,SW_SHOW );
}